Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

156
Views
¿Cómo puedo "ordenar múltiples" una matriz de objetos en Javascript por claves?

Estoy tratando de "mejorar" mi función de clasificación para aceptar múltiples criterios y así hacer una clasificación múltiple de mi matriz de objetos.

Lo siento si esta es una pregunta simple, o si cometí errores de "novato", pero soy un desarrollador de frontend que aprende los fundamentos de JS y estoy tratando de aprender cómo funcionan las funciones de clasificación.

Aquí está mi código:

 const arrayOfObjects = [ { name: 'John', age: 30, city: 'New York', details: { occupation: 'developer', } }, { name: 'Jane', age: 25, city: 'Paris', details : { occupation: 'designer', } } ]; // This is my main sorting function that I'd like to use for "multi sorting" an array of objects function sortByKey(criteria) { return (a, b) => { let comparison = 0; criteria.forEach(criterion => { const varA = (typeof resolvePath(criterion.key, a) === 'string') ? resolvePath(criterion.key, a).toUpperCase() : resolvePath(criterion.key, a); const varB = (typeof resolvePath(criterion.key, b) === 'string') ? resolvePath(criterion.key, b).toUpperCase() : resolvePath(criterion.key, b); if (varA > varB) { comparison = 1; } else if (varA < varB) { comparison = -1; } if(criterion.order === 'desc') { comparison = (comparison * -1) } }); return comparison; }; } // This function is used to resolve the path of a key in an object function resolvePath(path, obj) { return path.split('.').reduce(function(prev, curr) { return prev ? prev[curr] : null }, obj || self) }

El uso de esto es:

 // MAIN USAGE console.log( arrayOfObjects.sort(sortByKey([ { key: 'age' } ])) ) console.log( arrayOfObjects.sort(sortByKey([ { key: 'details.occupation', order: 'desc' } ])) )

Pero me gustaría usarlo algún tipo de:

 console.log( arrayOfObjects.sort(sortByKey([ { key: 'details.occupation' }, { key: 'age', order: 'desc' ])) )

Esto se debe a que quiero dar a los usuarios la posibilidad de clasificar mi matriz en algún tipo de orden, como "Primero la edad, segundo el nombre, etc...".

Gracias por cualquier ayuda útil, ¡que tengas un buen día!

about 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Cree una función que devuelva el valor del comparador para cada criterio. Recorra la matriz y llame a la función de comparación HASTA que se encuentre un valor distinto de cero. find dejará de buscar cuando compareByKey devuelva 1 o -1 .

 const sortByKey = (criteria) => (a, b) => { let returnValue = 0; criteria.find(c => returnValue = compareByKey(c, a, b)); return returnValue; } function compareByKey({ key, order = 'asc' }, a, b) { const varA = resolvePath(key, a) const varB = resolvePath(key, b) let comparison = 0; if (varA > varB) { comparison = 1; } else if (varA < varB) { comparison = -1; } if (order === 'desc') { comparison *= -1 } return comparison }

Si la parte de find es confusa o fea:

Otra forma sería reduce el valor de comparación de cada propiedad. Pero esto no provoca un cortocircuito cuando se encuentra un valor distinto de cero.

 const sortByKey = criteria => (a, b) => criteria.reduce((acc,c) => acc || compareByKey(c, a, b), 0)

o

 const sortByKey = (criteria) => (a, b) => { let comparedValue = 0; for (const c of criteria) { comparedValue = compareByKey(c, a, b); if (comparedValue) return comparedValue; } return comparedValue; } 

 const arrayOfObjects = [{ name: 'John', age: 30, city: 'New York', details: { occupation: 'developer', } }, { name: 'Jane', age: 25, city: 'Paris', details: { occupation: 'designer', } }, // added another designer for testing { name: 'Jane 2', age: 30, city: 'Paris', details: { occupation: 'designer', } } ]; const sortByKey = (criteria) => (a, b) => { let returnValue = 0; criteria.find(c => returnValue = compareByKey(c, a, b)); return returnValue; } function compareByKey({ key, order = 'asc' }, a, b) { const varA = resolvePath(key, a) const varB = resolvePath(key, b) let comparison = 0; if (varA > varB) { comparison = 1; } else if (varA < varB) { comparison = -1; } if (order === 'desc') { comparison *= -1 } return comparison } // This function is used to resolve the path of a key in an object function resolvePath(path, obj) { return path.split('.').reduce(function(prev, curr) { return prev ? prev[curr] : null }, obj || self) } console.log(arrayOfObjects.sort(sortByKey([ { key: 'details.occupation' }, { key: 'age', order: 'desc' } ])))

about 4 years ago · Santiago Trujillo Report

0

Puedes probar :

 const arrayOfObjects = [{ id: 3, name: 'Jane', age: 25, city: 'Paris', details: { occupation: 'designer', } }, { id: 1, name: 'John', age: 30, city: 'New York', details: { occupation: 'developer', } }, { id: 2, name: 'Bob', age: 25, city: 'New York', details: { occupation: 'developer', } }, ]; let sortByKey = function (a, b, keys) { for (let key of keys) { if (a[key.key] != b[key.key]) return (a[key.key] > b[key.key] ? 1 : -1) * (key.order == 'desc' ? -1 : 1); } return 0; } let result = arrayOfObjects.sort((a, b) => sortByKey(a, b, [{ key: 'age' }, { key: 'city', order: 'desc' }])); console.log(result);
about 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!